package psrc.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import psrc.logic.util.beans.TipoUsuario;
import psrc.logic.util.beans.UsuarioBean;

public class UsuarioDAO extends AbstractDAO {

	public UsuarioDAO(Connection conn) {
		super(conn);
	}

	@Override
	public <T> void adiciona(T _bean) throws SQLException{
		UsuarioBean bean = (UsuarioBean) _bean;
		String sql = "insert into Usuario "
				+ "(usuario, senha, tipo_usuario) values (?, ?, ?)";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, bean.getUsuario());
			stmt.setString(2, bean.getSenha());
			stmt.setString(3, bean.getTipoUsuario().toString());
			
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}

	@Override
	public <T> void remove(T _bean) throws SQLException{
		UsuarioBean bean = (UsuarioBean) _bean;
		try {
			PreparedStatement stmt = connection.prepareStatement("delete from Usuario where id_usuario=?");

			stmt.setInt(1, Integer.parseInt(bean.getIdUsuario()));

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}

	@Override
	public <T> void edita(T _bean) throws SQLException{
		UsuarioBean bean = (UsuarioBean) _bean;

		String sql = "update Usuario set " +"usuario=?, senha=?, tipo_usuario=? where usuario=?";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, bean.getUsuario());
			stmt.setString(2, bean.getSenha());
			stmt.setString(3, bean.getTipoUsuario().toString());
			stmt.setInt(4, Integer.parseInt(bean.getIdUsuario()));
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}

	@Override
	public <T> List<T> seleciona() throws SQLException {
		List<UsuarioBean> usuarios = new ArrayList<UsuarioBean>();

		try {
			PreparedStatement stmt = connection.prepareStatement("select * from Usuario");

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				UsuarioBean bean = new UsuarioBean();
				bean.setUsuario(rs.getString("usuario"));
				bean.setSenha(rs.getString("senha"));
				bean.setTipoUsuario(TipoUsuario.valueOf(rs.getString("tipo_usuario")));
				bean.setIdUsuario(rs.getString("id_usuario"));

				usuarios.add(bean);
			}
			rs.close();
			stmt.close();
			return (List<T>) usuarios;
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}

@Override
	public <T> List<T> selecionaPorId(T param) throws SQLException {
		List<UsuarioBean> usuarios = new ArrayList<UsuarioBean>();
		UsuarioBean user = (UsuarioBean) param;
		try {
			PreparedStatement stmt = connection

					.prepareStatement("select * from Usuario where usuario=?");
			stmt.setString(1, user.getUsuario());

			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				UsuarioBean bean = new UsuarioBean();
				bean.setUsuario(rs.getString("usuario"));
				bean.setSenha(rs.getString("senha"));
				bean.setTipoUsuario(TipoUsuario.valueOf(rs.getString("tipo_usuario")));
				bean.setIdUsuario(rs.getString("id_usuario"));

				usuarios.add(bean);
			}
			rs.close();
			stmt.close();
			return (List<T>) usuarios;
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}
}
